﻿using SecurityApp.Classes;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace SecurityApp
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        String strUitvoer = "";

        public MainWindow()
        {
            InitializeComponent();
            lblUitvoer.Content = "";
        }

        private void btnBladeren_Click(object sender, RoutedEventArgs e)
        {
            txtLocatie.Clear();
            bool dialogResult;

            // Dialoogvenster openen om een bestand te selecteren
            Microsoft.Win32.OpenFileDialog openDialog = new Microsoft.Win32.OpenFileDialog();
            openDialog.Filter = "Alle bestanden (.*)|*.*";
            dialogResult = (bool) openDialog.ShowDialog();
            
            // Het nieuwe bestand een naam geven afgaand op de naam van het origineel bestand
            if (dialogResult)
            {
                String strPad = openDialog.FileName;
                txtLocatie.Text = strPad;
                strUitvoer = strPad.Replace(".", "_2.");
                lblUitvoer.Content = "De uitvoer wordt opgeslagen als " + strUitvoer;
            }
        }

        private void btnEncrypteren_Click(object sender, RoutedEventArgs e)
        {
            encrypteren(false);
        }

        private void btnDecrypteren_Click(object sender, RoutedEventArgs e)
        {
            encrypteren(true);
        }

        private void encrypteren(Boolean isDecryptie)
        {
            // Nagaan of de sleutel 16 karakters is en of er een bestand gekozen is
            if (controleerSleutel() && controleerBestand())
            {
                btnBladeren.IsEnabled = false;
                btnDecrypteren.IsEnabled = false;
                btnEncrypteren.IsEnabled = false;

                // Het bestand uitlezen en omzetten naar binair
                String binaireInvoer = FileIO.bestandNaarBinair(txtLocatie.Text);

                //Thread t = new Thread(() => encrypteren(false));

                // Starten van de decryptie
                String binaireUitvoer = Crypto.startEncryptie(binaireInvoer, txtSleutel.Text, isDecryptie);

                // Het bestand wegschrijven
                FileIO.binairNaarBestand(strUitvoer, binaireUitvoer);

                btnBladeren.IsEnabled = true;
                btnDecrypteren.IsEnabled = true;
                btnEncrypteren.IsEnabled = true;
            }
        }

        #region controleMethodes

        private bool controleerSleutel()
        {
            // Eén hexadecimaal getal = 4 bits lang. 16*4=64bits
            if (txtSleutel.Text.Length == 16)
            {
                return true;
            }
            else
            {
                MessageBox.Show("De sleutel moet 16 hexadecimale getallen lang zijn.");
                return false;
            }
        }

        private bool controleerBestand()
        {
            if (txtLocatie.Text == "")
            {
                return false;
            }
            else
            {
                return true;
            }
        }

        private bool controleerHexadecimaal(Key key)
        {
            if (((Key.NumPad0 <= key) && (key <= Key.NumPad9)) ||
                ((Key.A <= key) && (key <= Key.F)))
            {
                return true;
            }
            return false;
        }

        private void txtSleutel_KeyDown(object sender, KeyEventArgs e)
        {
            if (txtSleutel.Text.Length < 16)
            {
                if (!controleerHexadecimaal(e.Key))
                {
                    e.Handled = true;
                }
                else
                {
                    e.Handled = false;
                }
            }
            else
            {
                e.Handled = true;
            }
        }

        #endregion

    }
}
